﻿#define CPPHTTPLIB_OPENSSL_SUPPORT
#define OPENSSL_SUPPRESS_DEPRECATED
#include <iostream>
#include "httplib.h"
#include <ctime>
using namespace std;


void gettime() {
    std::time_t now = std::time(nullptr);

    // 使用安全的localtime_s函数
    std::tm local_time;
    localtime_s(&local_time, &now);

    // 格式化输出
    char time_str[100];
    std::strftime(time_str, sizeof(time_str), "%Y-%m-%d %H:%M:%S", &local_time);

    std::cout << "\t\t" << time_str << std::endl;
}




void setpost(string key, string value)
{
    // 创建一个HTTPS客户端对象，目标URL使用https，确保URL是完整的
    httplib::SSLClient cli("open.iot.10086.cn", 443);  // 目标服务器的基本URL
    cli.enable_server_certificate_verification(false);

    // 动态变量
    std::string id = "1725362385";
    std::string version = "1.0";

    // 使用 stringstream 生成动态的 JSON 字符串
    std::stringstream ss;
    ss << R"({
    "id": ")" << id << R"(",
    "version": ")" << version << R"(",
    "params": {
        ")" << key << R"(": {
            "value": ")" << value << R"("
            }
        }
    })";

    // 生成最终的 POST 数据
    string post_data = ss.str();

    // 正确的URL路径（查询参数应该分开处理）
    string url_path = "/fuse/http/device/thing/property/post";

    // 查询参数应该作为单独的参数传递，或者编码在URL中
    string url_with_params = url_path + "?topic=$sys/XpZ7YmVMJD/watch/thing/property/post&protocol=HTTP";


    // 设置 HTTP 请求头
    httplib::Headers headers = {
        { "token", "version=2018-10-31&res=products%2FXpZ7YmVMJD%2Fdevices%2Fwatch&et=4567865678&method=md5&sign=0%2Fvhuftj0Pyrb9%2FosuramA%3D%3D" },              // 设置自定义头
        { "Content-Type", "application/json" }          // 确保 Content-Type 是 json 格式
    };

    // 发送POST请求
    auto rel = cli.Post(url_with_params.c_str(), headers, post_data, "application/json");

    // 检查响应
    if (rel && rel->status == 200) {
        cout << "Response: " << rel->body;  // 输出返回的响应内容
    }
    else {
        cerr << "Failed to send POST request, status code: ";
    }

    gettime();



}



int main() {
    // 创建 HTTP 服务器
    httplib::Server svr;

   

    // 设置 GET 请求处理
    svr.Get("/devices/receivedata?", [](const httplib::Request& req, httplib::Response& res) {
        //参数设置
        string temperature = "";    //体温
        string heart = "";          //心率
        string ox = "";             //血氧
        string get = "/devices/receivedata?";
        bool judg = false;


        if (req.has_param("temperature")) {
            temperature = req.get_param_value("temperature");
            cout << "Received Temperature(体温): " << temperature;
            gettime();
            if (judg)
            {
                get += "&";
            }
            get += "temperature="+(string)temperature;
            setpost("temperature", temperature);
            judg = true;
        }
        if (req.has_param("heart")) {
            heart = req.get_param_value("heart");
            cout << "Received Heart(心率): " << heart ;
            gettime();
            if (judg)
            {
                get += "&";
            }
            get += "heart=" + (string)heart;
            setpost("heart", heart);
            judg = true;
        }
        if (req.has_param("ox")) {
            ox = req.get_param_value("ox");
            cout << "Received Ox(血氧): " << ox;
            gettime();
            if (judg)
            {
                get += "&";
            }
            get += "ox=" + (string)ox;
            setpost("ox", ox);
            judg = true;
        }


        


        //auto les = cli.Get(get);
        });

    std::cout << "Server started " << std::endl;

    // 启动服务器
    svr.listen("0.0.0.0", 8080);

    return 0;
}



/*
1、配置头文件路径（C/C++ -> 常规 -> 附加包含目录）：

点击 C/C++ -> 常规。

在 附加包含目录 中，添加你的 OpenSSL include 目录的路径。



2、配置库文件路径（链接器 -> 常规 -> 附加库目录）：

点击 链接器 -> 常规。

在 附加库目录 中，添加你的 OpenSSL lib 目录的路径



3、添加依赖库（链接器 -> 输入 -> 附加依赖项）：

点击 链接器 -> 输入。

在 附加依赖项 中，添加你需要链接的 .lib 文件夹最里面的所有文件夹。

通常你需要同时链接 libssl.lib 和 libcrypto.lib。

例如：libssl.lib; libcrypto.lib;




*/